package com.study.kt._04project.encrypt

import java.lang.StringBuilder

/**
 * 每个字符往后移动n个字符
 * 'a'-->'d'
 */

/**
 * 频度分析法破解凯撒算法
 * 例如通常情况下一篇文章 字母 'e' 在英文中出现频率最高
 *  1.统计字母在文章中出现的频率次数
 *  2.因为e通常出现频率最高所以按照e的ascii为标准
 *  3.统计结果从最高的开始 取其ascii与e的ascii做差值当做key 解密
 *  4.从频率高到底一个一个试验，如果文章不乱码，则得出密码
 */

fun main() {
    val commond = "I am king"
    val key = 4
    val caearEncrypt = CaesarEncrypt()
    val encrypt = caearEncrypt.encrypt(commond, key)
    println("加密后：$encrypt")
    val decrypt = caearEncrypt.decrypt(encrypt, key)
    println("解密后：$decrypt")
}

class CaesarEncrypt {

    /**
     * 凯撒加密
     * @param input 原文
     * @param key 密钥
     */
    fun encrypt(input: String, key: Int): String {
        val inputCharArray = input.toCharArray()
        return with(StringBuilder()) {
            for (c in inputCharArray) {
                var ascii: Int = c.toInt()
                ascii += key
                append(ascii.toChar())
            }
            toString()
        }
    }

    /**
     * 凯撒解密
     * @param input 原文
     * @param key 密钥
     */
    fun decrypt(input: String, key: Int): String {
        val inputCharArray = input.toCharArray()
        return with(StringBuilder()) {
            for (c in inputCharArray) {
                var ascii: Int = c.toInt()
                ascii -= key
                append(ascii.toChar())
            }
            toString()
        }
    }
}